/**
 * 腾讯云TTS Web API服务
 */
const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const fs = require('fs');
const { v4: uuidv4 } = require('uuid');
const { textToSpeech } = require('./tencent_tts');

// 创建Express应用
const app = express();
const port = 5000;

// 使用JSON解析中间件
app.use(bodyParser.json());

// 存储临时音频文件的目录
const AUDIO_DIR = path.join(__dirname, 'audio_files');
if (!fs.existsSync(AUDIO_DIR)) {
    fs.mkdirSync(AUDIO_DIR, { recursive: true });
}

// 提供音频文件访问
app.get('/audio/:filename', (req, res) => {
    const filePath = path.join(AUDIO_DIR, req.params.filename);
    res.setHeader('Content-Type', 'audio/mpeg');
    res.sendFile(filePath);
});

// TTS API接口 - 接收文本生成音频
app.post('/tts', async (req, res) => {
    try {
        const { text, speed } = req.body;
        
        if (!text) {
            return res.status(400).json({ error: "请提供文本内容" });
        }
        
        // 解析语速参数，确保在有效范围内 [-2, 2]
        const speedValue = parseFloat(speed || 0);
        const validSpeed = Math.max(-2, Math.min(2, speedValue));
        
        // 按行分割文本
        const lines = text.trim().split('\n');
        const resultFiles = [];
        
        // 为每行文本生成单独的音频文件
        for (let i = 0; i < lines.length; i++) {
            const line = lines[i].trim();
            
            if (!line) {  // 跳过空行
                continue;
            }
            
            // 检查行文本长度
            if (line.length > 300) {  // 腾讯云TTS单次文本长度限制
                return res.status(400).json({ error: `第${i+1}行文本超过300字符限制` });
            }
            
            // 生成带行号的文件名
            const filename = `line_${i+1}_${uuidv4()}.mp3`;
            const outputPath = path.join(AUDIO_DIR, filename);
            
            // 调用TTS转换函数
            const result = await textToSpeech(line, outputPath, validSpeed);
            
            if (result) {
                // 添加到结果列表
                resultFiles.push({
                    line_number: i + 1,
                    text: line,
                    file_path: `/audio/${filename}`,
                    file_name: filename
                });
            } else {
                return res.status(500).json({ error: `第${i+1}行文本转语音失败` });
            }
        }
        
        // 返回所有生成的音频文件信息
        return res.json({ success: true, files: resultFiles });
        
    } catch (error) {
        console.error(error);
        return res.status(500).json({ error: `发生错误: ${error.message}` });
    }
});

// 主页 - 提供Web界面
app.get('/', (req, res) => {
    res.send(`
    <!DOCTYPE html>
    <html>
    <head>
        <title>腾讯云TTS文字转语音</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <style>
            body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
            textarea { width: 100%; height: 150px; margin-bottom: 10px; padding: 10px; }
            button { padding: 10px 15px; background-color: #4CAF50; color: white; border: none; cursor: pointer; }
            #result { margin-top: 20px; }
            .audio-item { margin-bottom: 15px; border: 1px solid #eee; padding: 10px; border-radius: 5px; }
            .line-number { font-weight: bold; margin-right: 10px; }
            .line-text { margin-bottom: 5px; color: #555; }
            audio { width: 100%; margin: 5px 0; }
            .settings { margin: 15px 0; padding: 10px; background: #f9f9f9; border-radius: 5px; }
            .slider-container { display: flex; align-items: center; margin-bottom: 10px; }
            .slider-container label { width: 80px; }
            .slider-container input[type="range"] { flex: 1; margin: 0 10px; }
            .slider-value { width: 40px; text-align: center; }
        </style>
    </head>
    <body>
        <h1>腾讯云TTS文字转语音 - 按行处理</h1>
        <div>
            <p>请输入要转换的文字，每行将被单独处理成一个音频文件：</p>
            <textarea id="textInput" placeholder="请输入要转换的文字，每行一句，每行不超过300字"></textarea>
            
            <div class="settings">
                <h3>语音设置</h3>
                <div class="slider-container">
                    <label for="speedSlider">语速:</label>
                    <input type="range" id="speedSlider" min="-2" max="2" step="0.1" value="0" oninput="updateSpeedValue(this.value)">
                    <span id="speedValue" class="slider-value">0</span>
                </div>
                <p class="setting-desc">语速范围: -2(较慢) 到 2(较快)，0为正常语速</p>
            </div>
            
            <button onclick="convertToSpeech()">转换为语音</button>
        </div>
        <div id="result"></div>

        <script>
        function updateSpeedValue(value) {
            document.getElementById('speedValue').textContent = value;
        }
        
        function convertToSpeech() {
            const text = document.getElementById('textInput').value.trim();
            if (!text) {
                alert('请输入文字内容！');
                return;
            }
            
            // 获取语速设置
            const speed = document.getElementById('speedSlider').value;
            
            const resultDiv = document.getElementById('result');
            resultDiv.innerHTML = '正在转换中，请稍候...';
            
            fetch('/tts', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify({ 
                    text: text,
                    speed: speed
                }),
            })
            .then(response => {
                if (!response.ok) {
                    return response.json().then(data => { throw new Error(data.error || '转换失败'); });
                }
                return response.json();
            })
            .then(data => {
                if (data.success && data.files && data.files.length > 0) {
                    let html = '<h3>转换成功！</h3>';
                    
                    // 为每一行生成音频播放控件
                    data.files.forEach(file => {
                        html += \`
                        <div class="audio-item">
                            <div class="line-number">第 \${file.line_number} 行:</div>
                            <div class="line-text">\${file.text}</div>
                            <audio controls src="\${file.file_path}"></audio>
                            <a href="\${file.file_path}" download="行\${file.line_number}_音频.mp3">下载此行音频</a>
                        </div>
                        \`;
                    });
                    
                    resultDiv.innerHTML = html;
                } else {
                    resultDiv.innerHTML = '<p style="color: red;">转换失败: 未返回任何文件</p>';
                }
            })
            .catch(error => {
                resultDiv.innerHTML = \`<p style="color: red;">错误: \${error.message}</p>\`;
            });
        }
        </script>
    </body>
    </html>
    `);
});

// 启动服务器
app.listen(port, () => {
    console.log(`服务已启动，访问 http://localhost:${port}`);
}); 